#ifndef CONEXION_H
#define CONEXION_H

#include <QtSql/QSqlDriver>
#include <QtSql/QSqlDatabase>
#include <QString>

typedef struct mDatos{
    QString name, apellidos;
    QString edad;
    QString sexo;
    QString email;
    QString telefono, celular;
    QString fechareg;
    QString nota;
}mDatos;

typedef struct cDatos{
    QString idc;
    QString name, apellidos;
    QString edad;
    QString sexo;
    QString email;
    QString telefono, celular;
    QString telefonot;
    QString emailt;
    QString web, twitter, facebook;
    QString nota;
    QString fechareg;
}cDatos;

//ESTUCTURA QUE ALMACENA LOS DATOS COMPLETOS DEL CONTACTO
//A USAR, SI UN CONTACTO NO USA TODOS LOS DATOS AQUI ENLISTADOS
//SE PROCEDE A LLENAR EL DATO COMO 'NO ESPECIFICADO'
typedef struct Datos{
    QString id;
    QString nombre, apellidos;
    QString edad;
    QString sexo;
    QString email;
    QString telefono, celular;
    QString telefonot, extencion, fax;
    QString emailt;
    QString web, twitter, facebook;
    QString direccion;
    QString nota;
    QString fechareg;
}Datos;

//STRUCTURA QUE ALMACENA EL NOMBRE Y APELLIDOS
//DEL CONTACTO A MOSTRAR EN LA BUSQUEDA
typedef struct datosCnt{
    QString name;
    QString apellidos;
    short int number;
    datosCnt* next;
}datosCnt;

/********************************************************
 ********************************************************/
//PRUEBA PARA USAR UN PATRON DE DISEÑO Y DISMINUIR
//LOS POSIBLES ERRORES CON LA CLASE

class conexionDB{
    protected:
        conexionDB( );
        conexionDB& operator=(conexionDB&);
        conexionDB( const conexionDB& );
        ~conexionDB( );
    private:
        static conexionDB* _instance;

        QSqlDatabase db;
        //PUNTERO A LA ESTRUCTURA QUE GUARDA LOS DATOS
        //ANTES DE INSERTARLOS EN LA BASE DE DATOS
        static Datos* dtsAll;
        //PUNTERO A LA ESTRUCTURA QUE ALMACENA LOS DATOS
        //DEL CONTACTO A MOSTRAR
        static datosCnt* dtsCnt;
        //VARIABLE QUE INDICA EL TIPO DE CONTACTOS
        //QUE TIENE ALMACENADA LA LISTA ENLAZADA SIMPLE
        //datosCnt
        QString typeDatosCnt;

    public:
        static conexionDB* instance( );
        static Datos* instanceDats( );
        static datosCnt* instanceCnts( );

        //FUNCION PARA LIMPIAR LOS DATOS DE LA ESTRUCTURA
        void clearDtsAll( void );
        //FUNCION QUE SIRVE PARA INSERTAR LOS DATOS EN LA BASE DE DATOS
        //SEGUN LA TABLA INDICADA
        void initDatsDataBase(const QString &table );

        //FUNCION QUE INDICA LA BASE DE DATOS A USAR
        //RETORNA TRUE SI NO HUBO PROBLEMAS CON LA BASE DE DATOS
        //FALSE EN CASO CONTRARIO
        bool addDatabaseDb3(const char* DB);
        //FUNCION PARA REALIZAR LA CONEXION CON LA BASE DE DATOS
        bool createConexionDb3( void );
        //FUNCION QUE INDICA SI HAY DATOS DE ALGUN USUARIO
        //DENTRO DE LA BASE DE DATOS
        bool userInUse( void );
        //FUNCION QUE INSERTA EN LA TABLA 'usuario' LO QUE
        //SE LE PASA COMO REFERENCIA  A LA FUNCION
        void userUse( const QString use );
        //FUNCION QUE INDICA SI LA CONEXION CON LA BASE DE DATOS
        //SE ENCUENTRA ACTIVA TRUE SI ESTA ACTIVA FALSE EN
        //CASO CONTRARIO
        bool inUseConexionDb3( void );
        //FUNCION PARA TERMINAR LA CONEXION CON LA BASE DE DATOS
        void closeConexionDb3( void );
        //FUNCION QUE RETORNA TRUE SI LA CONEXION ESTA ACTIVA
        //FALSE EN CASO CONTRARIO
        bool stateConexionDb3( void );

        //PARA MANEJAR LOS DATOS DEL USUARIO
        //FUNCION QUE AGREGA LOS DATOS DEL USUARIO
        //bool addDatsUser( const char *name );
        bool addDatsUser( const QString &name );
        bool addDatsUser(const QString &name, const QString &appep, const QString &edad, \
                         const QString &sexo, const QString &telefono, \
                         const QString &celular, const QString &email, const QString &nota );
        //FUNCION QUE RETORNA UN PUNTERO A LA ESTRUCTURA mDatos
        //QUE ES LA ENCARGADA DE REGRESAR LOS DATOS PERSONALES
        //QUE SE MOSTRARAN
        mDatos *showDatsUser( void );
        //FUNCION QUE RECIBE UN PUNTERO A LA CLASE QUE SE ENCARGA DE ALMACENAR
        //LOS DATOS DEL CLIENTE A INSERTAR
        //bool addDatsCltNew( cDatos *dats );

        //FUNCION QUE GUARDA EN LA LISTA ENLAZADA SIMPLE NOMBRE
        //Y APELLIDOS DE LOS CLIENTES
        //datosCnt** bDbCntl( void );
        //FUNCION QUE RECIBE COMO NOMBRE LA TABLA A BUSCAR
        void bDbCntl(const QString table );
        //FUNCION QUE METE LOS DATOS A LA LISTA ENLAZADA
        //void addDbCntl(struct datosCnt** lista, const QString Nombre, const QString Apellidos);
        void addDbCntl(struct datosCnt** lista, const QString Nombre, const QString Apellidos, short int number);
        //FUNCION QUE LIMPIA LA LISTA ENLAZADA Y LA DEJA LISTA PARA
        //SER USADA NUEVAMENTE
        void clearCntl( void );
        void clearAllCntl( struct datosCnt** lista );

        //FUNCION QUE RETORNA UN PUNTERO A LA CLASE QUE SE ENCARGA DE
        //REGRESAR LOS DATOS DEL CONTACTO A MOSTRAR SEGUN LA TABLE QUE SE INDICE
        //ESTA FUNCION USA LA MISMA ESTRUSTURA DE DATOS
        void showDatsCntl( const QString name, const QString Apellidos, const QString table );

        //FUNCION QUE BORRA LOS DATOS DE LA TABLA CLIENTES
        void clearDatsCntl( const QString name, const QString Apellidos, const QString table );

        //FUNCION PARA LIBERAR A MEMORIA
        void clearAll( void );
};


#endif // CONEXION_H
